// String Functions (字符串函数) 示例
// 演示 Pascal 中字符串函数的各种用法
program p_46_string_functions;

{$mode objfpc}{$H+}
// {$mode objfpc} 启用 Object Pascal 模式
// {$H+} 启用长字符串支持（AnsiString）

// 引入单元文件
uses
  SysUtils,      // 系统工具单元
  StrUtils,      // 字符串工具单元
  Classes;       // 类单元

// 基本字符串操作函数示例
procedure BasicStringOperations;
var
  text: String;
  subText: String;
  position: Integer;
begin
  WriteLn('1. 基本字符串操作函数:');
  text := 'Hello, Pascal Programming!';
  
  WriteLn('  原始文本: "', text, '"');
  WriteLn('  字符串长度 Length(text) = ', Length(text));
  WriteLn('  提取子串 Copy(text, 8, 6) = "', Copy(text, 8, 6), '"');
  WriteLn('  查找位置 Pos(''Pascal'', text) = ', Pos('Pascal', text));
  
  // 插入操作
  subText := text;
  Insert(' World', subText, 7);
  WriteLn('  插入后 Insert('' World'', text, 7) = "', subText, '"');
  
  // 删除操作
  subText := text;
  Delete(subText, 6, 8);
  WriteLn('  删除后 Delete(text, 6, 8) = "', subText, '"');
  
  // 连接操作
  WriteLn('  字符串连接 Concat(''Hello'', '' '', ''World'') = "', Concat('Hello', ' ', 'World'), '"');
end;

// 字符串查找和替换函数示例
procedure StringSearchAndReplace;
var
  text: String;
  replacedText: String;
begin
  WriteLn('2. 字符串查找和替换函数:');
  text := 'The quick brown fox jumps over the lazy dog. The fox is quick.';
  
  WriteLn('  原始文本: "', text, '"');
  WriteLn('  查找 ''fox'' 的位置: ', Pos('fox', text));
  WriteLn('  是否包含 ''quick'': ', BoolToStr(AnsiContainsStr(text, 'quick'), True));
  WriteLn('  是否以 ''The'' 开头: ', BoolToStr(AnsiStartsStr('The', text), True));
  WriteLn('  是否以 ''dog'' 结尾: ', BoolToStr(AnsiEndsStr('dog.', text), True));
  
  // 字符串替换
  replacedText := StringReplace(text, 'fox', 'cat', [rfReplaceAll]);
  WriteLn('  替换所有 ''fox'' 为 ''cat'': "', replacedText, '"');
  
  replacedText := StringReplace(text, 'The', 'A', [rfIgnoreCase]);
  WriteLn('  忽略大小写替换 ''The'' 为 ''A'': "', replacedText, '"');
  
  // 多次替换
  replacedText := text;
  replacedText := StringReplace(replacedText, 'quick', 'slow', [rfReplaceAll]);
  replacedText := StringReplace(replacedText, 'fox', 'turtle', [rfReplaceAll]);
  WriteLn('  多次替换结果: "', replacedText, '"');
end;

// 字符串格式化和转换函数示例
procedure StringFormattingAndConversion;
var
  number: Integer;
  floatNumber: Double;
  formattedText: String;
begin
  WriteLn('3. 字符串格式化和转换函数:');
  
  // 数字转字符串
  number := 42;
  WriteLn('  整数转字符串 IntToStr(42) = "', IntToStr(number), '"');
  
  floatNumber := 3.14159;
  WriteLn('  浮点数转字符串 FloatToStr(3.14159) = "', FloatToStr(floatNumber), '"');
  WriteLn('  格式化浮点数 Format(''%.2f'', [3.14159]) = "', Format('%.2f', [floatNumber]), '"');
  
  // 字符串转数字
  formattedText := '123';
  WriteLn('  字符串转整数 StrToInt(''123'') = ', StrToInt(formattedText));
  
  formattedText := '45.67';
  WriteLn('  字符串转浮点数 StrToFloat(''45.67'') = ', StrToFloat(formattedText):0:2);
  
  // 格式化字符串
  WriteLn('  格式化字符串 Format(''Hello %s, you have %d messages'', [''John'', 5]) = ');
  WriteLn('    "', Format('Hello %s, you have %d messages', ['John', 5]), '"');
  
  // 填充字符串
  formattedText := 'Pascal';
  WriteLn('  左填充 PadLeft(''Pascal'', 10, ''*'') = "', PadLeft(formattedText, 10, '*'), '"');
  WriteLn('  右填充 PadRight(''Pascal'', 10, ''*'') = "', PadRight(formattedText, 10, '*'), '"');
end;

// 字符串大小写处理函数示例
procedure StringCaseHandling;
var
  text: String;
begin
  WriteLn('4. 字符串大小写处理函数:');
  text := 'Hello, Pascal Programming!';
  
  WriteLn('  原始文本: "', text, '"');
  WriteLn('  转大写 UpperCase(text) = "', UpperCase(text), '"');
  WriteLn('  转小写 LowerCase(text) = "', LowerCase(text), '"');
  
  // 首字母大写
  text := 'hello world';
  WriteLn('  首字母大写 AnsiProperCase(''hello world'') = "', AnsiProperCase(text, ['''']), '"');
  
  // 比较函数
  var text1 := 'Hello';
  var text2 := 'HELLO';
  WriteLn('  普通比较 ''Hello'' = ''HELLO'': ', BoolToStr(text1 = text2, True));
  WriteLn('  忽略大小写比较 AnsiCompareText(''Hello'', ''HELLO'') = ', 
          AnsiCompareText(text1, text2));
  WriteLn('  忽略大小写相等 CompareText(''Hello'', ''HELLO'') = ', 
          BoolToStr(CompareText(text1, text2) = 0, True));
end;

// 字符串分割和合并函数示例
procedure StringSplittingAndJoining;
var
  text: String;
  stringList: TStringList;
  i: Integer;
begin
  WriteLn('5. 字符串分割和合并函数:');
  text := 'apple,banana,orange,grape,kiwi';
  
  WriteLn('  原始文本: "', text, '"');
  
  // 使用TStringList分割
  stringList := TStringList.Create;
  try
    stringList.Delimiter := ',';
    stringList.StrictDelimiter := True;
    stringList.DelimitedText := text;
    
    WriteLn('  分割结果:');
    for i := 0 to stringList.Count - 1 do
      WriteLn('    [', i, '] = "', stringList[i], '"');
    
    // 重新合并
    stringList.Delimiter := ';';
    WriteLn('  用分号合并: "', stringList.DelimitedText, '"');
  finally
    stringList.Free;
  end;
  
  // 使用SplitStrings函数
  WriteLn;
  WriteLn('  使用SplitStrings函数:');
  var parts: TStringArray;
  parts := SplitString(text, ',');
  for i := 0 to High(parts) do
    WriteLn('    [', i, '] = "', parts[i], '"');
  
  // 使用Join函数
  WriteLn('  使用Join函数合并: "', Join(' | ', parts), '"');
end;

// 字符串函数在实际问题中的应用示例
procedure PracticalStringApplications;
var
  email: String;
  fileName: String;
  csvLine: String;
begin
  WriteLn('6. 字符串函数在实际问题中的应用:');
  
  // 邮箱验证模拟
  email := 'user@example.com';
  WriteLn('  邮箱地址验证:');
  WriteLn('    邮箱: "', email, '"');
  if (Pos('@', email) > 0) and (Pos('.', email) > 0) then
    WriteLn('    格式有效: 是')
  else
    WriteLn('    格式有效: 否');
  
  var atPos := Pos('@', email);
  var domain := Copy(email, atPos + 1, Length(email));
  WriteLn('    域名部分: "', domain, '"');
  
  // 文件名处理
  WriteLn;
  fileName := 'document_v2_final.pdf';
  WriteLn('  文件名处理:');
  WriteLn('    文件名: "', fileName, '"');
  WriteLn('    文件扩展名: "', ExtractFileExt(fileName), '"');
  WriteLn('    不含扩展名: "', ChangeFileExt(fileName, ''), '"');
  WriteLn('    基本文件名: "', ExtractFileName(ChangeFileExt(fileName, '')), '"');
  
  // CSV数据处理
  WriteLn;
  csvLine := 'John,25,Engineer,"New York, NY",50000';
  WriteLn('  CSV数据处理:');
  WriteLn('    原始数据: "', csvLine, '"');
  
  // 简单处理（实际CSV处理需要更复杂的逻辑）
  var fields := SplitString(csvLine, ',');
  WriteLn('    字段数量: ', Length(fields));
  for var i := 0 to Min(4, High(fields)) do
    WriteLn('    字段[', i, ']: "', fields[i], '"');
end;

// 程序主入口
begin
  WriteLn('=== Pascal 字符串函数示例 ===');
  WriteLn;
  
  // 1. 基本字符串操作函数
  BasicStringOperations;
  
  WriteLn;
  
  // 2. 字符串查找和替换函数
  StringSearchAndReplace;
  
  WriteLn;
  
  // 3. 字符串格式化和转换函数
  StringFormattingAndConversion;
  
  WriteLn;
  
  // 4. 字符串大小写处理函数
  StringCaseHandling;
  
  WriteLn;
  
  // 5. 字符串分割和合并函数
  StringSplittingAndJoining;
  
  WriteLn;
  
  // 6. 字符串函数在实际问题中的应用
  PracticalStringApplications;
  
  WriteLn;
  WriteLn('演示了 Pascal 中字符串函数的各种用法');
  
  // 等待用户按键，防止程序窗口立即关闭
  ReadLn;
end.